package cn.larry.tools.time;

import cn.larry.tools.cons.Constants;
import cn.larry.tools.string.StringTool;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @version 1.1
 * @Author llin
 * @Date 2020/5/28 14:48
 */
public class TimeTool {

    public static SimpleDateFormat SDF_TIME_FORMAT_yyyyMMddHHmmss = new SimpleDateFormat(Constants.COMMON_TIME_FORMAT_yyyyMMddHHmmss);
    public static SimpleDateFormat SDF_TIME_FORMAT05 = new SimpleDateFormat(Constants.COMMON_TIME_FORMAT05);

    /**
     * 比较日期
     *
     * @param date1
     * @param date2
     * @param dateFormatStr 比较时统一日期格式
     * @return (0 ： date1 = date2 ； 1 ： date1 > date2 ； - 1 ： date1 < date2)
     */
    public static int dateCompare(Date date1, Date date2, String dateFormatStr) {
        SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatStr);
        Date dateFirst = null;
        try {
            dateFirst = dateFormat.parse(dateFormat.format(date1));
            Date dateLast = dateFormat.parse(dateFormat.format(date2));
            if (dateFirst.after(dateLast)) {
                return 1;
            } else if (dateFirst.before(dateLast)) {
                return -1;
            }
            return 0;
        } catch (ParseException e) {
            return 0;
        }
    }

    /**
     * 比较 时间
     *
     * @param compareTime 需要比较的时间
     * @param nowTime     现在的时间(default nowTime:yyyyMMdd)
     * @return true：compareTime < nowTime; false：else
     */
    public static boolean getCompareTime(String compareTime, String nowTime) {
        if (StringTool.isBlank(nowTime))
            nowTime = getNowTime(Constants.COMMON_TIME_FORMAT_yyyyMMdd);
        int compareTo = compareTime.compareTo(nowTime);
//		System.out.println("compareTo:"+compareTo);
        if (compareTo < 0)
            return true;
        else
            return false;
    }

    /**
     * 获取当前时间
     *
     * @param formatStr (default:yyyyMMdd)
     * @return now dateTimeString
     */
    public static String getNowTime(String formatStr) {
        if (StringTool.isBlank(formatStr))
            formatStr = Constants.COMMON_TIME_FORMAT_yyyyMMdd;
        SimpleDateFormat sdf = new SimpleDateFormat(formatStr);
        return sdf.format(new Date());
    }

    /**
     * 获取 明天的 这个时候
     *
     * @param dateFormatStr 时间格式(default:yyyyMMddHHmmss)
     * @return Time String
     * @throws Exception
     */
    public static String getTomorrowTime(String dateFormatStr) throws Exception {
        if (StringTool.isBlank(dateFormatStr))
            dateFormatStr = Constants.COMMON_TIME_FORMAT_yyyyMMddHHmmss;
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormatStr);
        calendar.add(Calendar.DAY_OF_YEAR, 1);
        Date date = calendar.getTime();
        return sdf.format(date);
    }

    /**
     * 获取当前时间相隔多久后的时间
     *
     * @param field         时间类型（月：Calendar.MONTH；日：Calendar.DAY_OF_YEAR； ...）
     * @param amount        时间变量（之前<0;之后>0）
     * @param dateFormatStr 时间格式(default:yyyyMMddHHmmss)
     * @return Time String
     * @throws Exception
     */
    public static String getTimeDifference(int field, int amount, String dateFormatStr) throws Exception {
        if (StringTool.isBlank(dateFormatStr))
            dateFormatStr = Constants.COMMON_TIME_FORMAT_yyyyMMddHHmmss;
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormatStr);
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(field, amount);
        date = calendar.getTime();
        return sdf.format(date);
    }

    /**
     * 获取当前时间相隔多久后的时间
     *
     * @param field  时间类型（月：Calendar.MONTH；日：Calendar.DAY_OF_YEAR； ...）
     * @param amount 时间变量（之前<0;之后>0）
     * @return
     * @throws Exception
     */
    public static Date getTimeDifference(int field, int amount) throws Exception {
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(field, amount);
        date = calendar.getTime();
        return date;
    }

    /**
     * 获取某个时间相隔多久后的时间
     *
     * @param oldDateTimeStr 当前时间（当前时间格式必须包含'时间格式'）
     * @param dateFormat     时间格式（返回的时间格式）
     * @param field          时间类型（月：Calendar.MONTH；日：Calendar.DAY_OF_YEAR； ...）
     * @param amount         时间变量（之前<0;之后>0）
     * @return
     * @throws Exception
     */
    public static String getTimeDifference(String oldDateTimeStr, String dateFormat, int field, int amount) throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(simpleDateFormat.parse(oldDateTimeStr));
        calendar.add(field, amount);
        return simpleDateFormat.format(calendar.getTime());
    }

    /**
     * 判断字符串是否为时间格式
     *
     * @param dateStr
     * @param formatStr 时间格式(default:yyyyMMdd)
     * @return
     */
    public static boolean isValidDate(String dateStr, String formatStr) {
        if (StringTool.isBlank(formatStr))
            formatStr = Constants.COMMON_TIME_FORMAT_yyyyMMdd;
        boolean convertSuccess = true;
        SimpleDateFormat format = new SimpleDateFormat(formatStr);
        try {
            // 设置lenient为false.
            // 否则SimpleDateFormat会比较宽松地验证日期
            format.setLenient(false);
            Date date = format.parse(dateStr);// 转换成日期
            if (!dateStr.equals(format.format(date)))// 对比转换后的日期字符串
                convertSuccess = false;
        } catch (ParseException e) {
            // 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
            convertSuccess = false;
        }
        return convertSuccess;
    }

    /**
     * 判定某个时间tradeTime是否在当前时间±timeNo
     *
     * @param tradeTime
     * @param timeNo    分钟
     * @return
     * @throws Exception
     */
    public static boolean compareDate(String tradeTime, int timeNo) throws Exception {
        boolean flag = false;
        String after = getTimeDifference(Calendar.MINUTE, timeNo, Constants.COMMON_TIME_FORMAT_yyyyMMddHHmmss);// 获取当前时间timeNo之后的时间
        String before = getTimeDifference(Calendar.MINUTE, -timeNo, Constants.COMMON_TIME_FORMAT_yyyyMMddHHmmss);// 获取当前时间timeNo之前的时间
        if (tradeTime.compareTo(before) >= 0 && tradeTime.compareTo(after) <= 0) {
            flag = true;
        }
        return flag;
    }

    /**
     * 判断日期是不是今天
     *
     * @param date
     * @return 是返回true，不是返回false
     */
    public static boolean isNowDate(Date date) {
        // 当前时间
        Date now = new Date();
        SimpleDateFormat sf = new SimpleDateFormat(Constants.COMMON_TIME_FORMAT09);
        //获取今天的日期
        String nowDay = sf.format(now);
        //对比的时间
        String day = sf.format(date);
        return day.equals(nowDay);
    }


    /**
     * 将格式“yyyyMMddHHmmss”时间的时间转换成格式“yyyy-MM-dd HH:mm:ss”
     *
     * @param strDate
     * @return
     */
    public static String dateStrFormat(String strDate) {
        if (StringTool.isBlank(strDate) || strDate.length() != 14)
            return null;

        StringBuilder sb = new StringBuilder();
        sb.append(strDate.substring(0, 4)).append("-").append(strDate.substring(4, 6)).append("-")
                .append(strDate.substring(6, 8)).append(" ").append(strDate.substring(8, 10)).append(":")
                .append(strDate.substring(10, 12)).append(":").append(strDate.substring(12, 14));
        return sb.toString();
    }


    /**
     * 根据日期获取是星期几
     *
     * @param date 默认今天
     * @return
     */
    public static String getWeek(Date date) {
        if (date == null)
            date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
        String week = sdf.format(date);
        return week;
    }

}
